package com.cy.pj.notice.web.controller;

import com.cy.pj.common.util.PageUtil;
import com.cy.pj.notice.service.SysNoticeService;
import com.cy.pj.notice.web.pojo.JsonResult;
import com.cy.pj.sys.pojo.SysNotice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 此对象为公告模块控制层处理器对象
 * 1.请求url设计
 * 1）条件查询（请求方式Ger，请求url"/notice/"）
 * 2）新增公告（请求方式-Post，请求url-"notice"）
 * 3）基于id查询（请求-Get，请求url-"notice/{id}"）
 * 4）更新公告（请求方式-Put,请求url-"/notice/"）
 * 5）删除公告（请求方式-Delete,请求url-"/notice{id}/"）
 *
 * 2.请求参数设计
 * 1）参数传递方式
 * 1.1）将请求参数通过url进行传递
 * 1.1.1）http://ip:port/?title=my&type=1
 * 1.1.2)http://ip:port/10
 *
 * 1.2）请求参数通过请求体进行传递
 * 1.2.1）{"title":"Study Spring Boot","Content":"Study...",...}
 *
 * 1.3）服务端接受请求参数
 * 1.3.1）直接量（8种基本数据类型，字符串，日期）
 * 1.3.2）pojo对象（但是需要提供和参数名对应的set方法）
 * 1.3.3）map对象（前提是必须使用@RequestParam或@RequestBody注解对参数进行描述）
 *
 * 1.4）方法参数描述
 * 1.4.1）@PathVariable  用于获取请求url中{}内部的变量值
 * 1.4.2）@RequestBody  用于获取请求体中Json格式的数据
 * 1.4.3）RequestParam  用于获取非Json格式的请求参数数据
 * 1.4.5）@DateTimeFormat  用于设置可以接受的日期格式字符串
 *
 * 2）响应标准设计（状态，消息，数据）:JsonResult
 */


//@ResponseBody
//@Controller
@RestController//内含@ResponseBody与@Controller两个注解
@RequestMapping("/notice")
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;

    //不带参数请求url:http://localhost:/notice/
    //带参数请求url:http://localhost:/notice/?type=1&title=my
    @GetMapping
    public JsonResult doFindNotices(SysNotice sysNotice){
        //      启动分页查询拦截
       /* PageInfo<SysNotice> pageInfo= PageHelper.startPage(1,3)
                .doSelectPageInfo(new ISelect() {
                    @Override
                    public void doSelect() {
                        sysNoticeService.findNotices(sysNotice);
                    }
                });*/
        return new JsonResult(PageUtil.startPage()
                .doSelectPageInfo(()->
                        sysNoticeService.findNotices(sysNotice)));
        //这个结果会返回给谁，调用方（DispatcherServlet）
        //方法调用方拿到方法执行结果以后会调用相关api将结果转换为json字符串
        //最后通过Response对象，将字符串响应到客户端
    }


    /**
     * 新增公告信息
     * @param notice
     * @return
     */
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice notice){
                sysNoticeService.saveNotice(notice);
        return new JsonResult("save ok");
    }



    /** rest风格中的urk允许使用变量，但这个变量需要用{}包起来
     * 当我们在方法参数中需要这个变量时，可以使用  @PathVariable
     * 对方法参数进行描述
     *
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable Long id){
//        try {
        return  new JsonResult(sysNoticeService.findById(id));
//        }catch (Exception e){
//            return new JsonResult(e);
//        }
    }

    /**
     * 更新公告信息
     * @param notice 风筝了公告信息的参数对象
     * @return
     */
    @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice notice){
        sysNoticeService.updateNotice(notice);
        return new JsonResult("update ok");
    }


    @DeleteMapping("{id}")
    public JsonResult doDeleteById(@PathVariable Long...id){
        sysNoticeService.deleteById(id);
        return new JsonResult("delete OK");
    }





}
